/**
 * vue项目所有文件命名全部采用中划线分隔   eleDistanceUtils
 * 创建时间：2021/7/19 16:41
 */
import typeOfUtils from '@/utils/type-of-utils'
import htmlElementUtils from '@/utils/htmlElementUtils'

const eleDistanceUtils = {
  /**
   * 获取元素是否在可视区域
   * @param el {HTMLElement}
   * @return {boolean|boolean}
   */
  isElementInViewport(el) {
    const rect = el.getBoundingClientRect()
    return (
      rect.top >= 0 &&
      rect.left >= 0 &&
      rect.bottom <=
      (window.innerHeight || document.documentElement.clientHeight) &&
      rect.right <=
      (window.innerWidth || document.documentElement.clientWidth)
    )
  },
  /**
   * 元素到左边的距离, 如果parent为空就是到window 的距离
   * @param ele {HTMLElement}
   * @param parent {HTMLElement?}
   */
  elementToLeft(ele, parent) {
    if (parent) { // 有父元素
      if (htmlElementUtils.hasChildren(parent, ele)) { // 判断是不是父子关系
        const leftELe = this.elementToLeft(ele)
        const leftPar = this.elementToLeft(parent)
        return leftELe - leftPar
      }
    } else { // 没有父元素,计算到window的距离
      if (typeOfUtils.isNotEmpty(ele.offsetLeft)) {
        let tmp = ele.offsetLeft
        let val = ele.offsetParent
        while (val != null) {
          tmp += val.offsetLeft
          val = val.offsetParent
        }
        return tmp
      }
    }
    return 0
  },
  /**
   * 元素到右边的距离, 如果parent为空就是到window 的距离
   * @param ele {HTMLElement}
   * @param parent {HTMLElement?}
   */
  elementToRight(ele, parent) {
    const left = this.elementToLeft(ele, parent)
    if (parent) { // 有父元素
      if (htmlElementUtils.hasChildren(parent, ele)) { // 判断是不是父子关系
        const pwidth = parent.offsetWidth
        const cwidth = ele.offsetWidth
        return pwidth - left - cwidth
      }
    } else { // 没有父元素,计算到window的距离
      const cwidth = ele.offsetWidth
      return document.body.offsetWidth - cwidth - left
    }
    return 0
  },
  /**
   * 元素到顶部的距离, 如果parent为空就是到window 的距离
   * @param ele {HTMLElement}
   * @param parent {HTMLElement?}
   */
  elementToTop(ele, parent) {
    if (parent) { // 有父元素
      if (htmlElementUtils.hasChildren(parent, ele)) { // 判断是不是父子关系
        const topELe = this.elementToTop(ele)
        const topPar = this.elementToTop(parent)
        return topELe - topPar
      }
    } else { // 没有父元素,计算到window的距离
      if (typeOfUtils.isNotEmpty(ele.offsetTop)) {
        let tmp = ele.offsetTop
        let val = ele.offsetParent
        while (val != null) {
          tmp += val.offsetTop
          val = val.offsetParent
        }
        return tmp
      }
    }
    return 0
  },
  /**
   * 元素到底部的距离, 如果parent为空就是到window 的距离
   * @param ele {HTMLElement}
   * @param parent {HTMLElement?}
   */
  elementToBottom(ele, parent) {
    const top = this.elementToTop(ele, parent)
    if (parent) { // 有父元素
      if (htmlElementUtils.hasChildren(parent, ele)) { // 判断是不是父子关系
        const pheight = parent.offsetHeight
        const cheight = ele.offsetHeight
        return pheight - top - cheight
      }
    } else { // 没有父元素,计算到window的距离
      const cheight = ele.offsetHeight
      return document.body.offsetHeight - cheight - top
    }
    return 0
  }
}

export default eleDistanceUtils
